`timescale 1ns/1ps

/////////////////////////////////////////////////////////////
// Author: Youhua Xu
// Date: 2023年8月15日
// CCD驱动模块，内部包含：
// 1）CCD驱动状态机
// 2）垂直驱动模块
// 3）水平驱动模块
// 4) 时钟模块
// @20240920: 基于原来的ccd_drv.v修改而来，模拟LM98725芯片
/////////////////////////////////////////////////////////////

module LM98725 (
    input clk_v,            //  1MHz
    input clk_h,            //  250MHz
    input clk_reg,          //  1MHz
    input clk_reg_half,     //  0.5MHz
    input ccd_drv_trig,

//    input[15:0] vtrans_num,
    input[15:0] htrans_num,

    input [31:0] ccd_I1_A,
    input [31:0] ccd_I1_B,
    input [31:0] ccd_I2_A,
    input [31:0] ccd_I2_B,
    input [31:0] ccd_I3_A,
    input [31:0] ccd_I3_B,
    input [31:0] ccd_I4_A,
    input [31:0] ccd_I4_B,
    input [31:0] ccd_Ix_MAX,

    input [31:0] ccd_phi1_A,
    input [31:0] ccd_phi1_B,
    input [31:0] ccd_phi2_A,
    input [31:0] ccd_phi2_B,
    input [31:0] ccd_phi3_A,
    input [31:0] ccd_phi3_B,
    input [31:0] ccd_rst_A,
    input [31:0] ccd_rst_B,
    
    output ccd_I1,
    output ccd_I2,
    output ccd_I3,
    output ccd_I4,

    output ccd_phi1,
    output ccd_phi2,
    output ccd_phi3,
    output ccd_rst,

    output status_htrans,
    output status_vtrans
);


wire vtrans_en, htrans_en;
wire vtrans_done;

// for debug:
// parameter vtrans_num = 16'd1;
// parameter htrans_num = 16'd5;

ccd_drv_sm i_ccd_drv_sm(
    .clk_1M(clk_v),
    .clk_reg(clk_reg),
    .sm_trig(ccd_drv_trig),
//    .vtrans_num(16'd1),
    .htrans_num(htrans_num),
    .vtrans_done(vtrans_done),

    .vtrans_en(vtrans_en),
    .htrans_en(htrans_en),

    .status_htrans(status_htrans),
    .status_vtrans(status_vtrans)
    );

vTrans i_vTrans(
    .clk_v(clk_v),
    .vtrans_en(vtrans_en),
    .ccd_I1_A(ccd_I1_A),
    .ccd_I1_B(ccd_I1_B),
    .ccd_I2_A(ccd_I2_A),
    .ccd_I2_B(ccd_I2_B),
    .ccd_I3_A(ccd_I3_A),
    .ccd_I3_B(ccd_I3_B),
    .ccd_I4_A(ccd_I4_A),
    .ccd_I4_B(ccd_I4_B),
    .ccd_Ix_MAX(ccd_Ix_MAX), //计数器的最大值，用于判定一次垂直转移是否已经结束
    .ccd_I1(ccd_I1),
    .ccd_I2(ccd_I2),
    .ccd_I3(ccd_I3),
    .ccd_I4(ccd_I4),
    .vtrans_done(vtrans_done)
    );

hTrans i_hTrans(
    .clk_h(clk_h),
    .clk_reg(clk_reg),
    .clk_reg_half(clk_reg_half),
    .htrans_en(htrans_en),
    .ccd_phi1_A(ccd_phi1_A),
    .ccd_phi1_B(ccd_phi1_B),
    .ccd_phi2_A(ccd_phi2_A),
    .ccd_phi2_B(ccd_phi2_B),
    .ccd_phi3_A(ccd_phi3_A),
    .ccd_phi3_B(ccd_phi3_B),
    .ccd_rst_A(ccd_rst_A),
    .ccd_rst_B(ccd_rst_B),
    .ccd_phi1(ccd_phi1),
    .ccd_phi2(ccd_phi2),
    .ccd_phi3(ccd_phi3),
    .ccd_rst(ccd_rst)
    );

endmodule
